package Day16;

public class Day16 {
    public static void main(String[] args) {
        //文件输入流继承自java.IO.InputStream
        //int read()返回一个字节的内容 放到int的低八位上 若返回-1则表示流已经读到末尾了
        //-1的2进制 11111111 11111111 11111111 11111111
        //1 byte 八位二进制 00000000--->11111111共256个值 (0-255)

        //怎么表示-1
        //-1+1= ?(0)若
        // 11111111+1 = ?
        //100000000   用来表示-1
        //-2怎么表示
        //-1-1   11111111-1=11111110
        //-3怎么表示
        //-2-1   11111110-1=11111101
        //最终到10000000 到最小值 (第一位1是符号位 1表示负数 0表示正数 剩下的是数据位 表示数字)
        //再减一01111111 到最大值
        //若计算机二进制中含有正数负数类似上述 利用的区分正负数方法称为补码

        //(第一位是符号位 剩下的数据位越小 代表的数字就越小 正负都适用)
        //例如
        //0000 0000  0000 0000   short正数最小值
        //1000 0000  0000 0000   short负数最小值


        //流是单向的 一次性的 想再从头开始读 需要关闭当前流重新打开一个新的流

        //读写 read() write()
        //单字节读写 电转磁 磁转电 效率差

        //引入了 块读写
        //超类java.io.InputStream上定义了块读字节的方法
        //读取 读取返回的int值表示字节数组读到的字节个数 而非数据本身
        //读到末尾传进来的字节数组不会产生变化 但是返回值还是会变成-1

        //问题 块读块写后 复制后的文件比原文件大一点
        //关键在于最后一次读取 最后一次数据可能不被复制速率整除 但是还是会被全写进去 多出的数据称为脏数据

        //解决此问题 OutputStream上定义了一个重载的方法(含头不含尾 off参数从下标从0开始 到读取到的字符长度len即可)

        //转字符集的时候 用的都是UTF-8
        //原因
        //0000 0000  ASC编码
        //0000 0000  0000 0000  UNICODE常用文字部分
        //当输入0110 0001 -> A  0110 0010 -> b
        //读取时 0110 0001   0110 0010 每个字节单独看:A b
        //                            当成两个字节一起看 可能会是一个汉字或符号

        //引入UTF-8 在unicode编码中加入长度信息让接收方识别
        //规则 英文就是单字节 以0开始
        //0000 0000--->0111 1111  0-127 原始的asc编码
        //中文需要使用三字节 原本unicode编码汉字需要2字节 还要加入长度信息 因此扩充为3字节

        //1110开始 一次连续读三个字节 后面紧跟的字节都需要以10开头
        //例如某个汉字2进制为10010111 00101010
        //    1001   011100   101010
        //1110xxxx 10xxxxxx 10xxxxxx
        //同理 1100开始 2个
        //例如 1100xxxx 10xxxxxx
        //1111开始 4个
        //例如 1111xxxx 10xxxxxx 10xxxxxx 10xxxxxx

        //文件流有两种创建方式
        //覆盖模式(流创建的那一刻起 若文件原本有内容 会全部删除)
        //追加模式(创建文件流时 文件若已创建 不会清空原内容 而是在句末追加内容)

        //小功能 记事本

        //读取文本数据

        //处理流 流的分类
        //处理流和节点流
        //节点流的特点 数据源明确
        //真实负责搬运数据的流
        //读写一定是建立在节点流基础之上的---低级流(基建 层级低)

        //处理流 不能独立存在 没有意义
        //必须对其他流进行处理 处理的既可以是节点流 也可以是其他处理流---高级流

        //注意 高级流之间可以进行流连接 但是必须要有一个低级流与它们连接

        //高级流在关闭时 会连同于他连接的低级流一起关闭 原理类似于热水器关了 水管子也就不流水了

        //流连接的意义
        //方便快捷

        //缓冲流
        //缓冲字节流
        /*
        内置了一个8192(1024*8=8Kb 可通过构造器调整)长的字节数组
        用于临时储存字节 保证不管程序是否为块读块写 都统一变成块读写方式
        */
        //1 BIS缓冲输入流
        //2 BOS缓冲输出流

        //输出流中的 flush方法
        /*
        java中规定 所有输出流都要有flush方法 因为流连接层数高了 bos的flush有可能调用不到
        因此用其他层的输出流的flush方法做连接 这些输出流的flush是没有实际flush作用的
        只有一个实现作用---用于调用下一层输出流的flush 直到调用到bos的flush方法为止
        */

        //对象流 需要实现Serializable接口(implements Serializable) 否则无法进行序列化
        //序列化 对象转成字节序列的过程 反之称为反序列化
        //对象输出流 构造器 ObjectOutputStream
        //对象输入流
        //修饰符 transient 瞬间的 瞬时的 用以忽略某些内容的属性
           //删掉后 不能直接读 因为之前写入的内容是被瘦身的 若想重新恢复属性 应该再写一遍

    }
}
